#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include "Objsocket.h"
unsigned long tamanioArchivo(unsigned char fd);

/*archivo,direccion IP,socket, tamaño de bloque en KB*/
int main(int argc,char *argv[]){
register char fd;
register int escrito=0,leido=1,enviado=0;
register unsigned int caracteres=1024*atoi(argv[4]);
register unsigned long total=0,tamanio=1;;
char buff[caracteres],envia[20],confirmacion[2];

memset(confirmacion,0,2);
Socket_T *sock;
Socket_T *sockserver;

  sock=NewSocketStream();
  sockserver=NewSocketStream();
  
  sock->Open(sock);
  sockserver->Open(sockserver);
  
  sockserver->Set_dir(sockserver,argv[2]);
  sockserver->Set_family(sockserver,AF_INET);
  sockserver->Set_port(sockserver,atoi(argv[3]));

  sock->conectate(sock,sockserver);

       if((fd=open(argv[1], O_RDONLY))==-1){
       	perror("open");
        return -1;
       }else printf("Se abrio el archivo con exito\n");

//le mado el tamanio del archivo				
			 tamanio = tamanioArchivo(fd);
			 printf("Tamanio archivo :[%lu]\n",tamanio);
			 memset(envia,0,20);
			 sprintf(envia,"%d",tamanio,10);
			
			//16 maxima cantidad de cifras de un numero rep en base 10 en C
			if(send(sock->Get_fd(*sock),envia,16,0)==-1){
				perror("send");
				return -1;
			}

				for(;leido;){
				           memset(buff,0,caracteres);

				           if((leido=read(fd,buff,caracteres))==-1)
				           {perror("read");
										return -1;}

									 memset(envia,0,20);
									 sprintf(envia,"%d",leido,10);
									 recv(sock->Get_fd(*sock),confirmacion,1,0);
									 if(send(sock->Get_fd(*sock),envia,strlen(envia),0)==-1){
										perror("send");
										return -1;
									 } 

									recv(sock->Get_fd(*sock),confirmacion,1,0);
									for(;enviado<leido;){
										 if((enviado=enviado+send(sock->Get_fd(*sock),buff+enviado,leido-enviado,0))==-1){
											perror("send");
											return -1;
											}
										}

									total=total+enviado;
									printf("Enviado :%d%\r",(total*100)/tamanio);
									enviado=0;
				   }

		printf("\ntotal enviado %lu",total);

		//calculo de md5
		unsigned char size=strlen(argv[1])+strlen("md5sum ")+strlen(" > md5S");
		char* cmdVerifMd5Sum=(char*) calloc(sizeof(char) * size,size+1);
		strcat(cmdVerifMd5Sum,"md5sum ");
		strcat(cmdVerifMd5Sum,argv[1]);
		strcat(cmdVerifMd5Sum," > md5S");

		if(system(cmdVerifMd5Sum)==-1)
				perror("system");

		//levanto el resultado		
		unsigned char lengt = strlen("5b9ed4f95c4bec42cf81e6abba225a0d");
		char cmdrta[lengt+1];
		memset(cmdrta,0,lengt+1);
		unsigned char md5fd=open("md5S",O_RDONLY);
		read(md5fd,cmdrta,lengt);			
		close(md5fd);

		/*envio el sm5*/
		if(send(sock->Get_fd(*sock),cmdrta,lengt,0)==-1){
				perror("send");
				return -1;
		} 

		close(fd);
		printf("\nmd5sum local: [%s]\n",cmdrta);
		sock->closeSocket(*sock);
		free(sock->Attr);
		free(sock);		
		return 0;
}

unsigned long tamanioArchivo(unsigned char fd){
struct stat info;
	fstat(fd,&info);
	return info.st_size;
}

